﻿using OT.HikiSecureCenterApis.Req;
using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.OneCard.Req;
using OT.HikiSecureCenterApis.Service.OneCard.Res;
using OT.HikiSecureCenterApis.Service.Video.Res;

namespace OT.HikiSecureCenterApis.Service.OneCard
{
    /// <summary>
    /// 一卡通应用服务 --> 一卡通权限管理
    /// 这块接口需要在header添加Token、tagId传递
    /// </summary>
    public partial class OneCardService
    {
        #region 根据人员与设备通道下载
        /// <summary>
        /// 按人员详情与设备下发 /api/acps/v1/authDownload/special/person/diy
        /// 针对少量权限（100设备通道*1000人）的下发场景，以异步任务方式下发出入控制权限。
        /// 1、接口支持下发优先级设置。优先级分为正常与快速两种方式，默认优先级为正常，其他异步下发接口的优先级都为正常方式。高优先级方式下发适用于需要权限快速生效的场景，但是频繁的使用高优先方式会造成下发队列的频繁切换可能会造成下发性能下降，请根据业务场景选择。
        /// 2、在当前任务中设置回调地址，每当一个设备下发完成时，通过回调地址主动通知调用方，采用restful回调模式，支持http和https，样式如下：http://ip:port/downloadRcv或者 https://ip:port/downloadRcv，建议业务组件在设置回调地址接收时，异步处理内部逻辑，避免请求超时（5秒超时）
        /// 3、 当添加系统外人员时，如果系统外人员中涉及生物特征数据（指纹、人脸模型数据）、卡密码敏感信息的需要通过《秘钥交换》接口后加密传输。
        /// 4、 每个tagId全局默认最多保持1000个可操作（未下发结束）任务列表。
        /// 说明：调用方在使用该接口下发权限时，如果也使用权限配置功能，那么可能会造成人员权限冲突的情况，acps以最后一次操作数据为准；比如对人员配置了权限又通过该接口删除权限，通过配置和指定下发分别下发不同的计划模板等。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> AuthDownloadSpecialPersonDiyAsync(ReqAuthDownloadSpecialPersonDiy req) =>
          await SecureCenterApis.PostAsync<object>("/api/acps/v1/authDownload/special/person/diy", 1.5, req);
        /// <summary>
        /// 查询按人员详情与设备下发信息 /api/acps/v1/authDownload/special/person/diy/result
        /// 根据人员或设备通道分页查询人员详情与设备下发信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResAuthDownloadSpecialPersonDiyResult"/></returns>
        public async Task<ResParameter<ResPageData<ResAuthDownloadSpecialPersonDiyResult>>?> AuthDownloadSpecialPersonDiyResultAsync(ReqAuthDownloadSpecialPersonDiyResult req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResAuthDownloadSpecialPersonDiyResult>>("/api/acps/v1/authDownload/special/person/diy/result", 1.5, req);
        /// <summary>
        /// 创建下载任务_根据人员与设备通道指定下载 /api/acps/v1/authDownload/task/addition
        /// 创建下载任务，以异步任务方式下载出入控制权限。适用于综合大楼、学校、医院等批量权限下载的场景。
        /// 创建下载任务，使得业务组件与出入控制权限服务建立一次异步下载的通道。
        /// 通过向下载任务中添加数据接口添加待下载的数据，包含资源、人员信息；可分多次调用该接口批量添加下载数据。
        /// 任务的操作权限由创建的业务组件控制，包含开始下载任务，终止下载任务，删除下载任务。
        /// 对已经开始的下载任务，可通过查询下载任务进度接口查询任务的总体下载进度和每个资源的下载进度信息。
        /// 一个下载任务最大支持100个设备的卡权限下载或者100个通道的人脸。
        /// 新创建的下载任务有效期7天，在7天内未操作开始下载的任务将自动清理。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="taskType">必填，下载任务类型 1：卡片 4：人脸 其他参考附录A.53 任务下载类型说明
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#c4c7357d
        /// </param>
        /// <returns><see cref="ManualRecordTask"/>只返回 taskId</returns>
        public async Task<ResParameter<ManualRecordTask>?> AuthDownloadTaskAddAsync(int taskType) =>
          await SecureCenterApis.PostAsync<ManualRecordTask>("/api/acps/v1/authDownload/task/addition", 1.2, new { taskType = taskType });
        /// <summary>
        /// 下载任务中添加数据_根据人员与设备通道指定下载 /api/acps/v1/authDownload/data/addition
        /// 该接口支持向新建的下载任务中添加待下载的权限数据，可通过本接口分多次向下载任务中添加数据。
        /// 单次接口最多支持100个设备资源和1000个人员，可分多次添加，多次添加的数据会合并处理。
        /// 同一个资源相同的人员重复添加时，以最后一次为准。
        /// 该接口强依赖于资源目录公共存储，请确保设备与人员相关的信息已存在公共存储，否则下载必定失败。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> AuthDownloadDataAddAsync(ReqAuthDownloadDataAdd req) =>
          await SecureCenterApis.PostAsync<object>("/api/acps/v1/authDownload/data/addition", 1.2, req);
        /// <summary>
        /// 简单同步权限下载_根据人员与设备通道指定下载 /api/acps/v1/authDownload/task/simpleDownload
        /// 简单权限下载主要用途对单个指定设备通道，下载少量简单的需即时生效的权限。通过同步下载方式下载权限，适合公安出租屋等场景。
        /// 使用该接口时无需创建下载任务，权限下载记录同步返回，接口超时时间30秒。
        /// 权限类型为人脸时，设备通道对象中的通道号有且只有一个。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResAauthDownloadTaskSimpleDownload>>?> AauthDownloadTaskSimpleDownloadAsync(ReqSimpleDownload req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResAauthDownloadTaskSimpleDownload>>("/api/acps/v1/authDownload/task/simpleDownload", 1.2, req);
        #endregion

        #region 出入权限配置及下载
        #region 出入权限配置
        /// <summary>
        /// 添加权限配置 /api/acps/v1/auth_config/add
        /// 权限配置支持按组织、人员和设备通道配置权限，适用综合大楼、学校、医院等场景。
        /// 说明：权限配置数据采用异步分批入库方式，接口调用成功后返回权限配置单编号，在配置的过程中分批插入数据，只有当配置单结束时才能查询到完整的权限配置信息。相同的配置数据重复配置时，第一次配置生效后，后面相同的配置将自动过滤丢弃。
        /// 合作方配置的tagId用于让多个应用共用出入控制权限服务时，用以区分各自的配置信息。
        /// 注意点：不同业务组件设备通道隔离，应该根据业务场景使用不同的设备通道配置权限；如对相同的设备通道都有业务应用，那么人员隔离，应该根据场景使用不同的人员，否则会造成权限条目归属相互竞争的情况，在权限条目综合查询时，数据归属以最后一次入库配置为准。
        /// 单次接口最多支持1000个设备资源和1000个人员数据。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ManualRecordTask"/>只返回 taskId</returns>
        public async Task<ResParameter<ManualRecordTask>?> AuthConfigAddAsync(ReqAuthConfigAdd req) =>
          await SecureCenterApis.PostAsync<ManualRecordTask>("/api/acps/v1/auth_config/add", 1.3, req);
        /// <summary>
        /// 查询权限配置 /api/acps/v1/auth_config/search
        /// 根据人员数据（组织、人员）、设备通道查询已配置的权限，合作方配置的tagId用于让多个应用共用出入控制权限服务时，用以区分各自的配置信息，即只能查询到同一个tagId的权限配置信息。
        /// 接口中人员数据、设备通道、设备通道分组至少一个不为空。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="page">必填，页码、页大小</param>
        /// <param name="resourceInfos">非必填，设备通道对象列表 channelIndexCodes字段不需要</param>
        /// <param name="personDataIds">非必填，人员数据编号</param>
        /// <param name="personDataType">非必填，人员数据类型 person: 人员 org: 组织</param>
        /// <param name="resourceDataType">非必填，查询资源类型（resource:设备通道,resourceGroup:设备通道分组）</param>
        /// <returns><see cref="ResAuthConfigSearch"/></returns>
        public async Task<ResParameter<ResPageData<ResAuthConfigSearch>>?> AuthConfigSearchAsync(ReqPage page, IList<ResourceInfo> resourceInfos = null,
            IList<string> personDataIds = null, string personDataType = null, string resourceDataType = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResAuthConfigSearch>>("/api/acps/v1/auth_config/search", 1.3, new
          {
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
              resourceInfos = resourceInfos,
              personDataIds = personDataIds,
              personDataType = personDataType,
              resourceDataType = resourceDataType
          });
        /// <summary>
        /// 删除权限配置 /api/acps/v1/auth_config/delete
        /// 根据人员数据、设备通道删除已配置的权限，合作方配置的tagId用于让多个应用共用出入控制权限服务时，用以区分各自的配置信息，即只能删除同一个tagId的权限配置信息。
        /// 入参中人员数据、设备通道至少一个不为空。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="personDatas">非必填，人员数据列表</param>
        /// <param name="resourceInfos">非必填，设备通道对象列表 channelIndexCodes字段不需要</param>
        /// <returns><see cref="ManualRecordTask"/>只返回 taskId</returns>
        public async Task<ResParameter<ManualRecordTask>?> AuthConfigDelAsync(IList<PersonData> personDatas = null, IList<ResourceInfo> resourceInfos = null) =>
          await SecureCenterApis.PostAsync<ManualRecordTask>("/api/acps/v1/auth_config/delete", 1.3, new
          {
              personDatas = personDatas,
              resourceInfos = resourceInfos
          });
        /// <summary>
        /// 查询权限配置单进度 /acps/api/v1/authConfig/task/progress
        /// 根据配置单编号查询配置单的配置进度，只能查询组件自身创建的配置单。
        /// 建议该接口调用频率每3-5秒查询一次进度。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.1及以上版本</remarks>
        /// <param name="taskId">必填，配置单唯一编号（最大长度：32）</param>
        /// <returns><see cref="ResAuthConfigTaskProgress"/></returns>
        public async Task<ResParameter<ResAuthConfigTaskProgress>?> AuthConfigTaskProgressAsync(string taskId) =>
          await SecureCenterApis.PostAsync<ResAuthConfigTaskProgress>("/acps/api/v1/authConfig/task/progress", 1.1, new { taskId = taskId });
        /// <summary>
        /// 人员权限扩展参数配置 /api/acps/v1/authConfig/configuration/extend
        /// 权限配置支持按人员和设备通道配置权限，适用人员权限有特殊参数需要下发的场景,人员权限扩展属性参考附录A.11"
        /// 说明：权限配置数据采用异步分批入库方式，接口调用成功后返回权限配置单编号，可通过《查询权限配置进度》，在配置的过程中分批插入数据，只有当配置单结束时才能查询到完整的权限配置信息。
        /// 权限配置的预计时间：每10万配置数据大概30秒。（配置数据量：人员数据量* 设备数据量）。
        /// 1、 相同的配置数据重复配置时，第一次配置生效后，后面相同的配置将自动过滤丢弃。
        /// 2、 在相同人员和设备通道多次配置时，权限有效期和计划模板信息以最后一次配置为准（比如：先对人员分组A与设备分组D1，D2配置了计划模板T1，有效期为day1的权限，再对人员分组A，B与设备分组D1配置计划模板t2，有效期为day2的权限，那么人员分组A与设备分组D1存在重复配置情况，最终人员分组A与设备分组D1的计划模板为t2，有效期为day2）；
        /// 3、 人员扩展参数变更后，相同的参数以最后一次为准，不同的参数会和以前的参数合并，第一次需要传入人员扩展参数初始化值，供权限删除时，设置设备上为初始化值。4、 在当前任务中设置回调地址，当配置完成时，通过回调地址主动通知调用方，采用restful回调模式，支持http和https，样式如下：http://ip:port/configRcv或者 https://ip:port/configRcv，建议业务组件在设置回调地址接收时，异步处理内部逻辑，避免请求超时（3秒超时）；该回调动作不管成功失败acps仅会触发一次，业务组件需要有对应的容错机制。
        /// 5、 tagId用于让多个应用共用出入控制权限服务时，用以区分各自的配置信息。建议使用组件标识。
        /// 注意点：不同业务组件设备通道隔离，应该根据业务场景使用不同的设备通道配置权限；如对相同的设备通道都有业务应用，那么人员隔离，应该根据场景使用不同的人员，否则会造成权限条目归属相互竞争的情况，在权限条目综合查询时，数据归属以最后一次入库配置为准。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="personIds">必填，人员编号集合(<=1000)</param>
        /// <param name="resourceInfos">必填，设备通道集合(<=100)</param>
        /// <param name="personExtendData">必填，人员扩展参数(Map<String, String> key-value形式, 参数总数不大于100)</param>
        /// <param name="templateId">非必填，计划模板配置信息（为空时，默认为全天候计划模板，最大长度：36）</param>
        /// <param name="startTime">非必填，	开始日期（开始/结束日期要么都为空要么都不为空，为空时默认长期有效，采用ISO8601时间格式，如2019-09-03T17:30:08.000+08:00）</param>
        /// <param name="endTime">非必填，结束日期</param>
        /// <param name="callbackUrl">非必填，回调地址（回调对象为查询权限配置单信息返回对象，接口不需要认证，最大长度：1024）</param>
        /// <returns><see cref="ManualRecordTask"/>只返回 taskId</returns>
        public async Task<ResParameter<ManualRecordTask>?> AuthConfigExtendAsync(IList<string> personIds, IList<ResourceInfo> resourceInfos,
            Dictionary<string, string> personExtendData, string templateId = null, string startTime = null, string endTime = null, string callbackUrl = null) =>
          await SecureCenterApis.PostAsync<ManualRecordTask>("/api/acps/v1/authConfig/configuration/extend", 1.5, new
          {
              personIds = personIds,
              resourceInfos = resourceInfos,
              templateId = templateId,
              startTime = startTime,
              endTime = endTime,
              callbackUrl = callbackUrl,
              personExtendData = personExtendData
          });
        /// <summary>
        /// 人员权限全局扩展参数配置 /api/acps/v1/authConfig/person/extend/setting
        /// 1.支持根据人员配置全局扩展参数,人员权限扩展属性参考附录A.11
        /// 2.删除人员权限扩展属性就是把属性置成默认值
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="personIds">必填，人员编号集合(<=1000)</param>
        /// <param name="personExtendData">必填，人员扩展参数(Map<String, String> key-value形式, 参数总数不大于100)</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> SetAuthConfigExtendAsync(IList<string> personIds, Dictionary<string, string> personExtendData) =>
          await SecureCenterApis.PostAsync<object>("/api/acps/v1/authConfig/person/extend/setting", 1.5, new
          {
              personIds = personIds,
              personExtendData = personExtendData
          });
        /// <summary>
        /// 获取人员权限全局扩展参数 /api/acps/v1/authConfig/person/extend/list
        /// 根据条件查询目录下有权限的梯控控制器列表。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="personIds">必填，人员列表（最大长度：1000）</param>
        /// <param name="page">必填，页码、页大小</param>
        /// <param name="personExtendKey">非必填，扩展参数Key(长度<=32位)</param>
        /// <param name="personExtendValue">非必填，扩展参数Value(长度<=32位)</param>
        /// <returns><see cref="ResAuthConfigExtend"/></returns>
        public async Task<ResParameter<ResPageData<ResAuthConfigExtend>>?> AuthConfigExtendListAsync(IList<string> personIds, ReqPage page,
            string personExtendKey = null, string personExtendValue = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResAuthConfigExtend>>("/api/acps/v1/authConfig/person/extend/list", 1.5, new
          {
              personIds = personIds,
              personExtend = !string.IsNullOrWhiteSpace(personExtendKey) && !string.IsNullOrWhiteSpace(personExtendValue) ?
              new { personExtendKey = personExtendKey, personExtendValue = personExtendValue } : null,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10
          });
        /// <summary>
        /// 人员权限使用状态设置 /api/acps/v1/authConfig/personAuth/useStatus/configuration
        /// 设置人员权限的使用状态，默认人员权限使用状态为有效，当设置其他状态后可通过设置权限有效状态恢复"
        /// 针对智能锁设备，人员权限状态的禁用和有效对应智能锁的冻结解冻功能。
        /// 1、 该接口是异步操作的过程，接口仅返回数据接收成功，可根据返回的任务编号通过查询下发任务进度，当下发结束时可根据权限下发记录查询章节接口查询下发结果。
        /// 2、 通过权限条目综合查询章节接口可获取人员的权限使用状态。
        /// 3、 tagId用于让多个应用共用出入控制权限服务时，用以区分各自的配置信息。建议使用组件标识。
        /// 4、 不支持系统外人员
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="personIds">必填，人员列表（最大长度：1000）</param>
        /// <param name="useStatus">必填，权限使用状态</param>
        /// <param name="resourceInfos">非必填，设备通道集合(<=100)</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> PersonAuthUseStatusAsync(IList<string> personIds, int useStatus,
            IList<ResourceInfo> resourceInfos = null) =>
          await SecureCenterApis.PostAsync<object>("/api/acps/v1/authConfig/personAuth/useStatus/configuration", 1.5, new
          {
              personIds = personIds,
              useStatus = useStatus,
              resourceInfos = resourceInfos
          });
        /// <summary>
        /// 获取人员权限使用状态 /api/acps/v1/authConfig/personAuth/useStatus/list
        /// 1.支持根据查询条件查询人员扩展信息
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="page">必填，页码、页大小</param>
        /// <param name="personIds">非必填，人员列表（最大长度：1000）</param>
        /// <param name="useStatus">非必填，权限使用状态</param>
        /// <param name="orgIndexCode">非必填，组织编号</param>
        /// <param name="subOrg">非必填，是否包含下级组织（1:包含,0:不包含,默认不包含下级）</param>
        /// <param name="personGroupId">非必填，人员分组编号</param>
        /// <returns><see cref="ResAuthConfigExtend"/></returns>
        public async Task<ResParameter<ResPageData<ResAuthConfigExtend>>?> PersonAuthUseStatusListAsync(ReqPage page, IList<string> personIds = null,
            int? useStatus = null, string orgIndexCode = null, int subOrg = 0, string personGroupId = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResAuthConfigExtend>>("/api/acps/v1/authConfig/personAuth/useStatus/list", 1.5, new
          {
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
              personIds = personIds,
              useStatus = useStatus,
              orgIndexCode = orgIndexCode,
              subOrg = subOrg,
              personGroupId = personGroupId
          });

        #endregion

        #region 根据出入权限配置下周
        /// <summary>
        /// 创建下载任务_根据出入权限配置下载 /api/acps/v1/download/configuration/task/add
        /// 创建下载任务，以异步任务方式根据权限配置异动（对权限未下载、下载失败、变更的数据重新下发）下载出入控制权限。适用于通过服务管理配置权限的情况，适用综合大楼、学校、医院等批量权限下载的场景
        /// 创建下载任务，使得业务组件与出入控制权限服务建立一次异步下载的通道。
        /// 任务类型支持组合下载方式，只要有一个类型符合时即可下载权限（即任务类型与设备能力集取交集）。
        /// 通过向下载任务中添加数据接口添加待下载的设备通道数据；可分多次调用该接口批量添加下载数据；当不调用添加数据接口，直接开始下载任务时，自动根据业务组件已配置的权限信息，对未下载成功的权限条目下载。
        /// 任务的操作权限由创建的业务组件控制，包含开始下载任务，终止下载任务，删除下载任务。
        /// 建议业务组件在设置回调地址接收时，异步处理内部逻辑，避免请求超时（5秒超时）
        /// 新创建的下载任务有效期7天，在7天内未操作开始下载的任务将自动清理。
        /// tagId用于让多个应用共用出入控制权限服务时，用以区分各自的下载任务。建议使用组件标识。
        /// 每个tagId全局默认最多保持100个可操作（未下载结束）任务列表。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="taskType">必填，下载任务类型 1：卡片 4：人脸 其他参考附录A.53 任务下载类型说明
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#c4c7357d
        /// </param>
        /// <returns><see cref="ManualRecordTask"/>只返回 taskId</returns>
        public async Task<ResParameter<ManualRecordTask>?> DownloadConfigTaskAddAsync(int taskType) =>
          await SecureCenterApis.PostAsync<ManualRecordTask>("/api/acps/v1/download/configuration/task/add", 1.3, new { taskType = taskType });
        /// <summary>
        /// 添加待下载的设备通道_根据出入权限配置下载 /api/acps/v1/download/configuration/data/add
        /// 选择要下发的设备或点位的所有人权限。
        /// 如果不调用此接口，代表下发所有人的所有设备和所有资源点的权限。
        /// 该接口支持向新建的下载任务中添加待下载的权限数据，可通过本接口分多次向下载任务中添加数据。
        /// 该接口强依赖于资源目录公共存储，请确保设备与人员相关的信息已存在公共存储，否则下载必定失败。
        /// 数据添加完成后必须调用 开始下载任务接口 才能下发权限。
        /// 单次接口最多支持100个设备通道对象。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="taskId">必填，下载任务唯一标识</param>
        /// <param name="resourceInfos">必填，资源对象,channelIndexCodes不需要传递</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> DownloadConfigDataAddAsync(string taskId, IList<ResourceInfo> resourceInfos) =>
          await SecureCenterApis.PostAsync<object>("/api/acps/v1/download/configuration/data/add", 1.3, new { taskId = taskId, resourceInfos = resourceInfos });
        /// <summary>
        /// 根据出入权限配置快捷下载 /api/acps/v1/authDownload/configuration/shortcut
        /// 针对少量权限的下载，减少调用方对接的复杂度，减少接口调用次数，该接口集合了创建任务-添加数据-开始下载3合1的功能。
        /// 单次接口最多支持100个设备通道对象。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="taskType">必填，下载任务类型 1：卡片 4：人脸 其他参考附录A.53 任务下载类型说明</param>
        /// <param name="resourceInfos">非必填，资源对象,channelIndexCodes不需要传递</param>
        /// <returns><see cref="ManualRecordTask"/>只返回 taskId</returns>
        public async Task<ResParameter<ManualRecordTask>?> AuthDownloadConfigShortcutAsync(int taskType, IList<ResourceInfo> resourceInfos = null) =>
          await SecureCenterApis.PostAsync<ManualRecordTask>("/api/acps/v1/authDownload/configuration/shortcut", 1.3, new
          {
              taskType = taskType,
              resourceInfos = resourceInfos
          });
        /// <summary>
        /// 根据权限配置重新下发人员权限 /api/acps/v1/authDownload/configuration/person/reset
        /// 下发或重置某个人员或设备的权限
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="personIds">必填，人员信息（最大长度：1000）</param>
        /// <param name="callbackUrl">非必填，回调地址（回调对象为附录C.34对象[List]，接口不需要认证，最大长度：1024）</param>
        /// <param name="resourceInfos">非必填，设备通道对象（最大长度：100）</param>
        /// <param name="isReset">非必填，是否重置权限(默认只下未下发数据)</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> AuthDownloadConfigPersonResetAsync(IList<string> personIds, string callbackUrl = null,
            IList<ResourceInfo> resourceInfos = null, bool? isReset = null) =>
          await SecureCenterApis.PostAsync<object>("/api/acps/v1/authDownload/configuration/person/reset", 1.5, new
          {
              personIds = personIds,
              callbackUrl = callbackUrl,
              resourceInfos = resourceInfos,
              isReset = isReset
          });
        #endregion
        #endregion

        #region 一卡通权限下载任务
        /// <summary>
        /// 开始下载任务 /api/acps/v1/authDownload/task/start
        /// 该接口用于开始一次下载任务，只能由创建任务的组件触发。权限下载完成后会自动结束下载任务。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="taskId">必填，下载任务唯一标识</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> AuthDownloadTaskStartAsync(string taskId) =>
          await SecureCenterApis.PostAsync<object>("/api/acps/v1/authDownload/task/start", 1.2, new { taskId = taskId });
        /// <summary>
        /// 查询下载任务进度 /api/acps/v1/authDownload/task/progress
        /// 根据任务ID查询任务的下载进度，只能查询由组件创建的任务，进度信息包含任务总体下载进度及各个资源的下载进度。
        /// 建议该接口调用频率每3-5秒查询一次任务的下载进度。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="taskId">必填，下载任务唯一标识</param>
        /// <returns><see cref="ResAuthDownloadTaskProgress"/></returns>
        public async Task<ResParameter<ResAuthDownloadTaskProgress>?> AuthDownloadTaskProgressAsync(string taskId) =>
          await SecureCenterApis.PostAsync<ResAuthDownloadTaskProgress>("/api/acps/v1/authDownload/task/progress", 1.2, new { taskId = taskId });
        /// <summary>
        /// 查询正在下载的任务列表 /api/acps/v1/authDownload/task/list
        /// 该接口用于查询正在下载的任务编号列表，只能查询由组件创建的任务
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <returns><see cref="string"/></returns>
        public async Task<ResParameter<ResPageData<string>>?> AuthDownloadTaskListAsync() =>
          await SecureCenterApis.PostAsync<ResPageData<string>>("/api/acps/v1/authDownload/task/list", 1.2);
        /// <summary>
        /// 删除未开始的下载任务 /api/acps/v1/authDownload/task/deletion
        /// 该接口用于删除创建的下载任务，已经开始下载的任务不能删除，只能由创建任务的组件触发。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="taskId">必填，下载任务唯一标识</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> AuthDownloadTaskDelAsync(string taskId) =>
          await SecureCenterApis.PostAsync<object>("/api/acps/v1/authDownload/task/deletion", 1.2, new { taskId = taskId });
        /// <summary>
        /// 终止正在下载的任务 /api/acps/v1/authDownload/task/stop
        /// 该接口用于终止正在下载的任务，未开始下载的任务不能停止，只能由创建任务的组件触发。当全部资源已终止下载后会自动结束下载任已经终止下载的任务，将会被清除出任务列表，无法被再次开启。
        /// 终止下载任务时丢弃还未下载的数据，对已下载的数据记录下载记录和日志。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> AuthDownloadTaskStopAsync(string taskId) =>
          await SecureCenterApis.PostAsync<object>("/api/acps/v1/authDownload/task/stop", 1.2, new { taskId = taskId });
        /// <summary>
        /// 查询任务信息列表 /api/acps/v1/authDownload/task/search
        /// 该接口用于分页查询任务的详细信息
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="page">必填，页码、分页大小</param>
        /// <param name="authTaskIds">非必填，下载任务唯一标志，创建任务时获取</param>
        /// <param name="authTaskStatusList">非必填，任务状态，0-未下载，1-下载中，2-下载完成</param>
        /// <param name="operationTypeList">非必填，任务操作类型，详见附录A.82 任务操作类型
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95#c4c7357d
        /// </param>
        /// <param name="taskTypeList">非必填，下载任务类型列表，详见附录A.53 任务下载类型说明
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95#c4c7357d
        /// </param>
        /// <returns><see cref="ResAuthDownloadTaskSearch"/></returns>
        public async Task<ResParameter<ResPageData<ResAuthDownloadTaskSearch>>?> AuthDownloadTaskSearchAsync(ReqPage page, IList<string> authTaskIds = null,
            IList<int> authTaskStatusList = null, IList<int> operationTypeList = null, IList<int> taskTypeList = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResAuthDownloadTaskSearch>>("/api/acps/v1/authDownload/task/search", 1.5, new
          {
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageNo ?? 10,
              authTaskIds = authTaskIds,
              authTaskStatusList = authTaskStatusList,
              operationTypeList = operationTypeList,
              taskTypeList = taskTypeList
          });
        #endregion

        #region 一卡通权限下载记录
        /// <summary>
        /// 查询设备通道权限下载记录列表 /api/acps/v1/download_record/channel/list/search
        /// 根据查询条件分页查询设备通道的下载记录，只能查询由业务组件自身创建的任务下载记录。
        /// 下载记录主要展示此次下载的概览信息，可通过查询设备通道的下载记录详情接口查询每个设备通道中人员的下载详情。、
        /// 支持通过任务编号查询单个任务的下载记录。
        /// 支持通过设备通道查询设备通道的历史下载记录（卡权限下载记录只能通过设备查询，人脸下载可通过设备和通道查询）。
        /// 支持通过任务编号、设备通道对象、下载时间、下载类型查询历史下载记录。
        /// 该接口仅返回分页的列表数据，不返回总数。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="page">必填，页码、页大小</param>
        /// <param name="taskId">非必填，下载任务唯一标识，32位数字+字母（小写）字符串</param>
        /// <param name="resourceInfos">非必填，设备通道对象列表，channelIndexCodes不需要传递</param>
        /// <param name="taskTypes">非必填，下载任务类型 1：卡片 4：人脸其他参考附录A.53 任务下载类型说明
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#c4c7357d
        /// </param>
        /// <param name="downloadResult">非必填，下载结果，0：成功，1：失败，2：部分成功</param>
        /// <param name="downloadStartStartTime">非必填，下载开始时间查询对象-开始日期</param>
        /// <param name="downloadStartEndTime">非必填，下载开始时间查询对象-结束日期</param>
        /// <param name="downloadEndStartTime">非必填，下载结束时间查询对象-开始日期</param>
        /// <param name="downloadEndRndTime">非必填，下载结束时间查询对象-结束日期</param>
        /// <param name="sortObjects">非必填，排序对象，目前只支持下载开始与结束时间排序</param>
        /// <returns><see cref="ResDownloadRecordList"/></returns>
        public async Task<ResParameter<ResPageData<ResDownloadRecordList>>?> DownloadRecordListAsync(ReqPage page, string taskId = null, IList<ResourceInfo> resourceInfos = null,
            IList<int> taskTypes = null, int? downloadResult = null, string downloadStartStartTime = null, string downloadStartEndTime = null,
            string downloadEndStartTime = null, string downloadEndRndTime = null, IList<ReqSort> sortObjects = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResDownloadRecordList>>("/api/acps/v1/download_record/channel/list/search", 1.3, new
          {
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
              taskId = taskId,
              resourceInfos = resourceInfos,
              taskTypes = taskTypes,
              downloadResult = downloadResult,
              downloadStartTime = !string.IsNullOrWhiteSpace(downloadStartStartTime) || !string.IsNullOrWhiteSpace(downloadStartEndTime) ?
              new { startTime = downloadStartStartTime, endTime = downloadStartEndTime } : null,
              downloadEndTime = !string.IsNullOrWhiteSpace(downloadEndStartTime) || !string.IsNullOrWhiteSpace(downloadEndRndTime) ?
              new { startTime = downloadStartStartTime, endTime = downloadStartEndTime } : null,
              sortObjects = sortObjects
          });
        /// <summary>
        /// 查询设备通道权限下载记录总数 /api/acps/v1/download_record/channel/total/search
        /// 根据查询条件查询设备通道的下载记录总数。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="taskId">非必填，下载任务唯一标识，32位数字+字母（小写）字符串</param>
        /// <param name="resourceInfos">非必填，设备通道对象列表，channelIndexCodes不需要传递</param>
        /// <param name="taskTypes">非必填，下载任务类型 1：卡片 4：人脸其他参考附录A.53 任务下载类型说明
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#c4c7357d
        /// </param>
        /// <param name="downloadResult">非必填，下载结果，0：成功，1：失败，2：部分成功</param>
        /// <param name="downloadStartStartTime">非必填，下载开始时间查询对象-开始日期</param>
        /// <param name="downloadStartEndTime">非必填，下载开始时间查询对象-结束日期</param>
        /// <param name="downloadEndStartTime">非必填，下载结束时间查询对象-开始日期</param>
        /// <param name="downloadEndRndTime">非必填，下载结束时间查询对象-结束日期</param>
        /// <returns><see cref="ResParameter{T}"/>data 表示 下载记录总数</returns>
        public async Task<ResParameter<int>?> DownloadRecordTotalListAsync(string taskId = null, IList<ResourceInfo> resourceInfos = null,
            IList<int> taskTypes = null, int? downloadResult = null, string downloadStartStartTime = null, string downloadStartEndTime = null,
            string downloadEndStartTime = null, string downloadEndRndTime = null) =>
          await SecureCenterApis.PostAsync<int>("/api/acps/v1/download_record/channel/total/search", 1.3, new
          {
              taskId = taskId,
              resourceInfos = resourceInfos,
              taskTypes = taskTypes,
              downloadResult = downloadResult,
              downloadStartTime = !string.IsNullOrWhiteSpace(downloadStartStartTime) || !string.IsNullOrWhiteSpace(downloadStartEndTime) ?
              new { startTime = downloadStartStartTime, endTime = downloadStartEndTime } : null,
              downloadEndTime = !string.IsNullOrWhiteSpace(downloadEndStartTime) || !string.IsNullOrWhiteSpace(downloadEndRndTime) ?
              new { startTime = downloadStartStartTime, endTime = downloadStartEndTime } : null,
          });
        /// <summary>
        /// 查询设备通道的人员权限下载详情v2 /api/acps/v2/download_record/person/detail/search
        /// 根据查询条件查询设备通道的人员下载详情。
        /// 该接口用于查询单个下载任务某一设备通道的下载详情信息。
        /// 接口仅返回分页的列表数据，不返回总数。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="page">必填，页码、页大小</param>
        /// <param name="downloadResultId">下载记录唯一ID,使用downloadResultId查询设备通道下载记录详情时，忽略taskId与resourceInfo字段（“下载记录唯一ID”和“下载任务标识+设备通道对象”两者必须有一个不为空），从查询设备通道权限下载记录列表接口获取返回参数downloadResultId</param>
        /// <param name="taskId">非必填，下载任务唯一标识，从查询设备通道权限下载记录列表接口获取返回参数taskId</param>
        /// <param name="resourceInfos">非必填，设备通道对象列表，channelIndexCodes不需要传递</param>
        /// <param name="personIds">非必填，人员编号列表，查询人员列表v2接口获取返回报文中的personId字段，最大长度1000</param>
        /// <param name="orgIds">非必填，组织编号，查询组织列表v2接口获取返回报文中的orgIndexCode字段，最大长度1000</param>
        /// <param name="downloadResult">非必填，下载结果，0：成功，1：失败，2：部分成功</param>
        /// <param name="downloadTimeStart">非必填，下载时间查询对象-开始日期</param>
        /// <param name="downloadTimeEnd">非必填，下载时间查询对象-结束日期</param>
        /// <param name="sortObjects">非必填，排序对象，目前只支持下载开始与结束时间排序</param>
        /// <returns><see cref="ResourceDownloadDetail"/></returns>
        public async Task<ResParameter<ResPageData<ResourceDownloadDetail>>?> DownloadRecordPersonDetailSearchAsync(ReqPage page, string downloadResultId = null, string taskId = null,
            IList<ResourceInfo> resourceInfos = null, IList<string> personIds = null, IList<string> orgIds = null, int? downloadResult = null,
             string downloadTimeStart = null, string downloadTimeEnd = null, IList<ReqSort> sortObjects = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResourceDownloadDetail>>("/api/acps/v2/download_record/person/detail/search", 1.4, new
          {
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
              downloadResultId = downloadResultId,
              taskId = taskId,
              resourceInfos = resourceInfos,
              personIds = personIds,
              orgIds = orgIds,
              downloadResult = downloadResult,
              downloadTime = !string.IsNullOrWhiteSpace(downloadTimeStart) || !string.IsNullOrWhiteSpace(downloadTimeEnd) ?
              new { startTime = downloadTimeStart, endTime = downloadTimeEnd } : null,
              sortObjects = sortObjects
          });
        /// <summary>
        /// 查询设备通道的人员权限下载详情总数v2 /api/acps/v2/download_record/person/total/search
        /// 根据查询条件查询设备通道的人员下载详情总数，支持下载中和已完成下载的设备通道查询。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="downloadResultId">下载记录唯一ID,使用downloadResultId查询设备通道下载记录详情时，忽略taskId与resourceInfo字段（“下载记录唯一ID”和“下载任务标识+设备通道对象”两者必须有一个不为空），从查询设备通道权限下载记录列表接口获取返回参数downloadResultId</param>
        /// <param name="taskId">非必填，下载任务唯一标识，从查询设备通道权限下载记录列表接口获取返回参数taskId</param>
        /// <param name="resourceInfos">非必填，设备通道对象列表，channelIndexCodes不需要传递</param>
        /// <param name="personIds">非必填，人员编号列表，查询人员列表v2接口获取返回报文中的personId字段，最大长度1000</param>
        /// <param name="orgIds">非必填，组织编号，查询组织列表v2接口获取返回报文中的orgIndexCode字段，最大长度1000</param>
        /// <param name="downloadResult">非必填，下载结果，0：成功，1：失败，2：部分成功</param>
        /// <param name="downloadTimeStart">非必填，下载时间查询对象-开始日期</param>
        /// <param name="downloadTimeEnd">非必填，下载时间查询对象-结束日期</param>
        /// <returns><see cref="ResParameter{T}"/>data 表示 下载详情总数</returns>
        public async Task<ResParameter<int>?> DownloadRecordPersonTotalSearchAsync(string downloadResultId = null, string taskId = null,
            IList<ResourceInfo> resourceInfos = null, IList<string> personIds = null, IList<string> orgIds = null, int? downloadResult = null,
             string downloadTimeStart = null, string downloadTimeEnd = null) =>
          await SecureCenterApis.PostAsync<int>("/api/acps/v2/download_record/person/total/search", 1.4, new
          {
              downloadResultId = downloadResultId,
              taskId = taskId,
              resourceInfos = resourceInfos,
              personIds = personIds,
              orgIds = orgIds,
              downloadResult = downloadResult,
              downloadTime = !string.IsNullOrWhiteSpace(downloadTimeStart) || !string.IsNullOrWhiteSpace(downloadTimeEnd) ?
              new { startTime = downloadTimeStart, endTime = downloadTimeEnd } : null,
          });
        #endregion

        #region 一卡通权限条目
        /// <summary>
        /// 查询权限条目总数 /api/acps/v1/auth_item/total/search
        /// 根据人员或设备通道查询权限条目总数。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="queryType">必填，查询资源类型，参考附录A.50 设备通道类型
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#d98f04ce
        /// </param>
        /// <param name="personIds">非必填，人员ID列表</param>
        /// <param name="orgIds">非必填，组织列表</param>
        /// <param name="resourceInfos">非必填，资源设备对象信息，channelIndexCodes不需要传递</param>
        /// <param name="personStatus">非必填，人员状态 0：已配置未下载 1：更新待下载 2：更新待删除 3：已下载 4：未配置</param>
        /// <param name="cardStatus">非必填，卡片状态0：已配置未下载 1：更新待下载 2：更新待删除 3：已下载 4：未配置</param>
        /// <param name="faceStatus">非必填，人脸状态 0：已配置未下载 1：更新待下载 2：更新待删除 3：已下载 4：未配置</param>
        /// <param name="startTime">非必填，配置时间查询对象-开始日期</param>
        /// <param name="endTime">非必填，配置时间查询对象-结束日期</param>
        /// <returns><see cref="ResParameter{T}"/>data 表示 权限条目总数</returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> AuthItemTotalSearchAsync(string queryType, IList<string> personIds = null, IList<string> orgIds = null,
            IList<ResourceInfo> resourceInfos = null, IList<int> personStatus = null, IList<int> cardStatus = null, IList<int> faceStatus = null,
            string startTime = null, string endTime = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/acps/v1/auth_item/total/search", 1.3, new
          {
              queryType = queryType,
              personIds = personIds,
              orgIds = orgIds,
              resourceInfos = resourceInfos,
              personStatus = personStatus,
              cardStatus = cardStatus,
              faceStatus = faceStatus,
              configTime = !string.IsNullOrWhiteSpace(startTime) || !string.IsNullOrWhiteSpace(endTime) ?
              new { startTime = startTime, endTime = endTime } : null,
          });
        /// <summary>
        /// 查询权限条目列表 /api/acps/v1/auth_item/list/search
        /// 根据人员或设备通道分页查询权限条目信息，即人员对应的设备通道的权限配置和下载状态。适用于查询人员配置了哪些通道权限或者通道配置哪些人员权限场景。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="queryType">必填，查询资源类型，参考附录A.50 设备通道类型
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#d98f04ce
        /// </param>
        /// <param name="page">必填，页码、页大小</param>
        /// <param name="personIds">非必填，人员ID列表</param>
        /// <param name="orgIds">非必填，组织列表</param>
        /// <param name="resourceInfos">非必填，资源设备对象信息，channelIndexCodes不需要传递</param>
        /// <param name="personStatus">非必填，人员状态 0：已配置未下载 1：更新待下载 2：更新待删除 3：已下载 4：未配置</param>
        /// <param name="cardStatus">非必填，卡片状态0：已配置未下载 1：更新待下载 2：更新待删除 3：已下载 4：未配置</param>
        /// <param name="faceStatus">非必填，人脸状态 0：已配置未下载 1：更新待下载 2：更新待删除 3：已下载 4：未配置</param>
        /// <param name="startTime">非必填，配置时间查询对象-开始日期</param>
        /// <param name="endTime">非必填，配置时间查询对象-结束日期</param>
        /// <returns><see cref="ResAuthItemList"/></returns>
        public async Task<ResParameter<ResPageData<ResAuthItemList>>?> AuthItemListSearchAsync(string queryType, ReqPage page, IList<string> personIds = null, IList<string> orgIds = null,
            IList<ResourceInfo> resourceInfos = null, IList<int> personStatus = null, IList<int> cardStatus = null, IList<int> faceStatus = null,
            string startTime = null, string endTime = null, IList<ReqSort> sortObjects = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResAuthItemList>>("/api/acps/v1/auth_item/list/search", 1.3, new
          {
              queryType = queryType,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
              personIds = personIds,
              orgIds = orgIds,
              resourceInfos = resourceInfos,
              personStatus = personStatus,
              cardStatus = cardStatus,
              faceStatus = faceStatus,
              configTime = !string.IsNullOrWhiteSpace(startTime) || !string.IsNullOrWhiteSpace(endTime) ?
              new { startTime = startTime, endTime = endTime } : null,
              sortObjects = sortObjects
          });
        /// <summary>
        /// 查询单个权限条目 /api/acps/v1/auth_item/single/search
        /// 根据人员和设备通道查询一条权限条目信息，适用于判断指定人员与通道的权限情况，比如中心控制，远程开门等场景。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="personId">必填，人员ID</param>
        /// <param name="resourceInfo">必填，设备通道对象，只支持单个通道查询</param>
        /// <returns><see cref="ResAuthItemList"/></returns>
        public async Task<ResParameter<ResAuthItemList>?> AuthItemSingleSearchAsync(string personId, ResourceInfo resourceInfo) =>
          await SecureCenterApis.PostAsync<ResAuthItemList>("/api/acps/v1/auth_item/single/search", 1.3, new
          {
              personId = personId,
              resourceInfo = resourceInfo
          });
        #endregion
    }
}
